#ifndef FCM_H_
#define FCM_H_

#include <time.h>
#include <math.h>

typedef struct strucDoubletArray {
	double *array;
	int size;
} doubleArray;

typedef struct structDouble2DArray {
	doubleArray **matrix;
	int size;
} double2DArray;

typedef struct structFCM {
	double2DArray *weight; // Pesos
	double2DArray *output; // Saídas
	double2DArray *input; // Entradas

	int numInputs; // Número de entradas
	int numOutputs; // Número de saídas
	int winOutput; // Saída vencedora
	int numIt; // Número de iterações
	int maxNumIt; // Número máximo de iterações
	int exponent; // Expoente de peso
	double learnRate; // Taxa de aprendizado
	char *netFileName; // Arquivo de rede
	char *setFileName; // Arquivo do conjunto de treino
	double2DArray *xtInput; // Conjunto de entradas de treino
} FCM;
void FCMUpdateWeights(FCM *fcm);
void FCMUpdateLearnRate(FCM *fcm);

FCM *FCMCreate(void);
void FCMDestroy(FCM *fcm);
void FCMCreateNet(FCM *fcm);
void FCMDeleteNet(FCM *fcm);
void FCMDeleteSet(FCM *fcm);
void FCMLoadSetFromFile(FCM *fcm);
void FCMSaveNet(FCM *fcm);
void FCMLoadNet(FCM *fcm);
void FCMCompute(FCM *fcm);
void FCMTraining(FCM *fcm);
void FCMAddPattern(FCM *fcm);
void FCMTrainingOnLinePattern(FCM *fcm);

double **FCMGetWeight(FCM *fcm);
double **FCMGetOutput(FCM *fcm);
double **FCMGetInput(FCM *fcm);
int FCMGetNumInputs(FCM *fcm);
int FCMGetNumOutputs(FCM *fcm);
int FCMGetWinOutput(FCM *fcm);
int FCMGetNumIt(FCM *fcm);
int FCMGetMaxNumIt(FCM *fcm);
int FCMGetExponent(FCM *fcm);
double FCMGetLearnRate(FCM *fcm);
char *FCMGetNetFileName(FCM *fcm);
char *FCMGetSetFileName(FCM *fcm);
double **FCMGetXtInput(FCM *fcm);

#endif /*FCM_H_*/
